home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / imlib / ppmread.c < prev    next >
C/C++ Source or Header  |  1997-05-20  |  2KB  |  109 lines

  1. #include "image.hpp"
  2. #include "palette.hpp"
  3. #include <stdio.h>
  4. #include "macs.hpp"
  5. #include "ppmread.hpp"
  6. #include "dprint.hpp"
  7.  
  8. int read_ppm_header(FILE *fp, int *parm)
  9. {
  10.   int nr;
  11.   char st[100],sig[50];
  12.   nr=0;
  13.   fscanf(fp,"%s",sig);
  14.   if (!strcmp(sig,"P6"))
  15.   {
  16.     do
  17.     {
  18.       fscanf(fp,"%s",sig);
  19.       if (sig[0]=='#')
  20.         fgets(st,100,fp);
  21.       else
  22.       { 
  23.         if (sscanf(sig,"%d",parm))
  24.         {  nr++; parm++; }
  25.         else return 0;
  26.       } 
  27.     } while (nr<3 && !feof(fp));
  28.   }
  29.   else return 0;
  30. //  fgets(st,100,fp);
  31.   return 1;
  32.  
  33. void write_ppm(image *im,palette *pal,char *fn)
  34. {
  35.   FILE *fp;
  36.   CHECK(im && pal && fn);
  37.   unsigned char r[3],*c;
  38.   int x,y;
  39.   clear_errors();
  40.   fp=fopen(fn,"wb");
  41.   if (!fp) set_error(imWRITE_ERROR);
  42.   else
  43.   {
  44.     fprintf(fp,"%s %d %d %d\n","P6",im->width(),im->height(),(int)256);
  45.     for (y=0;y<im->height();y++)
  46.     { c=(unsigned char *)im->scan_line(y);
  47.       for (x=0;x<im->width();x++)
  48.       { r[0]=pal->red(c[x]);
  49.     r[1]=pal->green(c[x]);
  50.     r[2]=pal->blue(c[x]);
  51.     fwrite(&r[0],1,1,fp);
  52.     fwrite(&r[1],1,1,fp);
  53.     fwrite(&r[2],1,1,fp);
  54.       }
  55.     }
  56.     fclose(fp);
  57.   }
  58. }
  59.  
  60. #define TSIZE 1001
  61.  
  62. image *read_ppm(char *fn,palette *&pal, int pal_type)
  63. {
  64.   FILE *fp;
  65.   image *im;
  66.   unsigned char *c,col[3];
  67.  
  68.   char buf[30];
  69.   int l,h,maxc,i,j,parm[3],find_color;
  70.   CONDITION(fn,"Null filename");
  71.   clear_errors();
  72.   fp=fopen(fn,"rb");
  73.   im=NULL;
  74.   CONDITION(fp,"Filename not found"); 
  75.   if (!fp) { set_error(imFILE_NOT_FOUND); return NULL; }
  76.  
  77.   if (read_ppm_header(fp, parm)==0) set_error(imFILE_CORRUPTED);
  78.   else
  79.   {
  80.     l=parm[0]; h=parm[1]; maxc=parm[2];
  81.     
  82.     if (!pal)
  83.       pal=new palette;
  84.     fgets(buf,30,fp);
  85.     im=new image(l,h);
  86.     dprintf("Created image %d,%d\n",l,h);
  87.     for (i=0;i<h;i++)
  88.     { c=(unsigned char *)im->scan_line(i);
  89.       for (j=0;j<l;j++)
  90.       {
  91.     if (fread(col,1,3,fp)!=3) set_error(imFILE_CORRUPTED);
  92.     if (pal_type==PPM_R3G3B2)
  93.       c[j]=(col[0]*7/255)|((col[1]*7/255)<<3)|((col[2]*3/255)<<6);
  94.     else if (pal_type==PPM_BW)
  95.       c[j]=col[0]*255/parm[2];
  96.     else
  97.     {
  98.       find_color=pal->find_color(col[0],col[1],col[2]);
  99.       if (find_color>=0) c[j]=find_color;
  100.       else c[j]=(unsigned char) pal->add_color(col[0],col[1],col[2]);
  101.     }
  102.       }
  103.     }
  104.   }
  105.   fclose(fp);
  106.   return im;
  107. }
  108.